Django建站历程:(九)发布我的第一篇博客

2018年12月24日 Jerry 5292 2021年1月17日

1、确认model属性

       要定义一个model,我们首先要基本确认他的所需属性。例如一篇文章,大体可能需要如下属性:文章标题、作者、创建时间、文章摘要、文章内容、文章分类等。而定义一个文章的分类,又有如下属性:分类名称、分类介绍等。文章可以属于一个分类,而一个文章分类中可以有多篇文章。有了大体的关系属性,我们开始修改代码。

2、创建model

      在app/blog/model.py文件中创建文章model和目录model

from django.db import models
from django.conf import settings

# Create your models here.

# 文章分类model
class Catalogue(models.Model):
        name = models.CharField('分类名称', max_length=20)
        slug = models.SlugField('唯一标识', unique=True, default='cata_slug_default(请修改)')
        disc = models.TextField('分类介绍', max_length=300, default='请输入该分类的介绍....')

        class Meta:
                verbose_name = '文章分类'
                verbose_name_plural = verbose_name
                ordering=['name']

        def __str__(self):
                return self.name

# 文章model
class Article(models.Model):
        author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='作者')
        title = models.CharField(max_length=150, verbose_name='标题')
        summary = models.TextField('摘要', max_length=300, default='请输入文章摘要....')
        body = models.TextField(verbose_name='内容', default='请输入文章内容....')
        create_date = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

        #slug 。这个其实就是用在文章的URL的。
        #比如你现在一篇文章的标题是“i like django”,你可以把slug设置成"i-like-django",然后显示在浏览器的地址URL就是比如这样www.example.com/article/i-like-django/
        #因为每个文章都是唯一的,这个slug也一定要唯一,所以你在里面设置的参数是unique=True。    
        slug = models.SlugField('唯一标识', unique=True, max_length=20, default='slug_input_default(请修改)')
        catalogue = models.ForeignKey(Catalogue, on_delete=models.CASCADE, verbose_name='文章分类')

        class Meta:
                verbose_name = '文章'                  #通俗易懂的名字
                verbose_name_plural = verbose_name      # 复数形式
                ordering=['-create_date']               # 降序排序

        def __str__(self):
                return self.title[:20]

      具体字段一看就懂,具体用法就不说了,可以自己搜索学习下。注意这里有个slug字段,这个解释注释也写了:slug 这个其实就是用在文章的URL的标识。比如你现在一篇文章的标题是“i like django”,你可以把slug设置成"i-like-django",然后显示在浏览器的地址URL就是比如这样www.example.com/article/i-like-django/  。因为每个文章都是唯一的,这个slug也一定要唯一,所以你在里面设置的参数是unique=True。   

3、修改admin.py文件

      修改app/blog/admin.py如下,这样就可以在后台看到相关的文章、分类字段

from django.contrib import admin
from blog.models import Article, Catalogue

# Register your models here.

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'summary', 'author','body','id'] # 显示列表项
    list_filter = ('author',) # 过滤器

@admin.register(Catalogue)
class CatalogueAdmin(admin.ModelAdmin):
        list_display = ['name', 'disc', 'id']

 添加完成后同步数据库

root@jerryls-site1:/home/mysite# ./manage.py makemigrations
Migrations for 'blog':
  apps/blog/migrations/0001_initial.py
    - Create model Article
    - Create model Catalogue
    - Add field catalogue to article
root@jerryls-site1:/home/mysite# ./manage.py migrate
Operations to perform:
  Apply all migrations: account, admin, auth, blog, contenttypes, myauth, sessions, sites, socialaccount
Running migrations:
  Applying blog.0001_initial... OK
root@jerryls-site1:/home/mysite# 

此时,运行网站进入后台管理界面就可以看到文章、分类:

jerrycoding Django建站历程:(九)发布我的第一篇博客

4、创建分类和文章

我们创建一个”唐诗三百首“分类,并在下面新添加一篇古诗。

jerrycoding Django建站历程:(九)发布我的第一篇博客

jerrycoding Django建站历程:(九)发布我的第一篇博客

同样的方法创建第二个分类“儿歌”和第二篇文章“葫芦娃”。

5、显示目录及文章

       上述管理员可以在后台添加文章分类及文章,点击保存后,相关文章信息就被保存到了数据库。那如何在网页前端显示呢?大体思路还是如下:创建html---> 添加view视图 ---> 添加路由

1)新建html文件

代码如下:

<div class="list-group">
  <a class="list-group-item disabled">文章标题</a>
{% for article in article_list %}
  <a href="{% url 'blog:article_url' article.slug %}" class="list-group-item">{{article.title}}</a>
{% empty %}
<h3>暂时没有文章!</h3>
{% endfor %}
</div>

逻辑很简单,对传入的article_list进行遍历,显示出所有文章即可。那这个list哪里来的呢?继续看,你会发现是下面这个view传进来的。

2)添加view视图

def index_view(request):
    #return HttpResponse("Hello World! From Jerry Coding")
    articles = Article.objects.all()  # 获取所有文章数据
    catalogues = Catalogue.objects.all() # 获取所有分类数据

    return render(request, 'blog/index.html', {'article_list':articles, 'cata_list':catalogues}) #返回给index用于显示
    # return render(request, 'blog/index.html')

 此时运行已经可以显示我们所有文章了:

jerrycoding Django建站历程:(九)发布我的第一篇博客

如果需要实现点击文章标题就进入文章内容页,以及点击分类实现只显示属于该分类的文章,我们需要用到我们之前定义的slug。

添加一个文章内容视图和分类内容视图:

from django.shortcuts import get_object_or_404

def article_view(request, slug):
    article = get_object_or_404(Article, slug=slug)  #获取该slug的文章
    return render(request,'blog/article_detail.html', {'article':article})   # 返回article_detail.html页面

def catalogue_view(request, slug):
    this_cata = get_object_or_404(Catalogue, slug=slug) #找到该目录
    articles = Article.objects.filter(catalogue = this_cata) # 找到属于该目录的所有文章
    catalogues = Catalogue.objects.all() # 获取所有分类数据

    return render(request, 'blog/cata_detail.html', {'article_list':articles, 'cata_list':catalogues})

其中参数slug需要我们的url传进来,同时需要创建cata_detail.html和article_detail.html模板文件,代码就不贴了。可以参考github源码

3)添加路由

from .views import index_view, article_view, catalogue_view

urlpatterns = [
    path('', index_view, name='index_url'),
    path('article/<str:slug>', article_view, name='article_url'),
    path('cata/<str:slug>', catalogue_view, name='cata_url'),
]

在html文件中设置反向解析url链接后即可访问:

<a href="{% url 'blog:article_url' article.slug %}" class="list-group-item">{{article.title}}</a>

最后实现的效果如下:

jerrycoding Django建站历程:(九)发布我的第一篇博客

jerrycoding Django建站历程:(九)发布我的第一篇博客

 

敲了半天,博主是又码字又截图的,总算可以发布我们的文章了!今晚是平安夜,祝看到这篇文章的各位平平安安~

快12点了,博主头昏脑胀,晚安了各位!~


《django 建站历程系列文章》

(一)服务器的选取与环境准备

(二)创建第一个project和app

(三)创建并显示博客的主页导航栏

(四)django-allauth实现用户登陆

(五)django-allauth实现第三方登陆

(六)使用bootstrap3美化登陆界面

(七)添加用户签名字段

(八)自定义用户头像

(九)发布我的第一篇博客

(十)CKEditor的配置使用

(十一)ajax实现文章添加评论

(十二)signal自动消息通知

(十三)基于django-haystack的全文搜索

(十四)配置SSL证书实现网站HTTPS访问

(十五)免费开启七牛云CDN加速

(十六)particles 粒子背景插件

(十七)集成 xadmin2 后台管理

(十八)RestFramework 编写API

(十九)Nginx+uwsgi 部署 django

(二十)自定义网站404界面

(二一)jwt为API添加身份认证

jerrycoding 博客源码大公开


原创文章,转载请注明出处: https://jerrycoding.com/article/site_building_9

微信
jerry微信赞助
支付宝
jerry支付宝赞助

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论